// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
(function(window) {
  'use strict';

  function GrDomHooks(plugin) {
    this._plugin = plugin;
    this._hooks = {};
  }

  GrDomHooks.prototype._getName = function(endpointName) {
    return this._plugin.getPluginName() + '-autogenerated-' + endpointName;
  };

  GrDomHooks.prototype.getDomHook = function(endpointName) {
    const hookName = this._getName(endpointName);
    if (!this._hooks[hookName]) {
      this._hooks[hookName] = new GrDomHook(hookName);
    }
    return this._hooks[hookName];
  };

  function GrDomHook(hookName) {
    this._callbacks = [];
    // Expose to closure.
    const callbacks = this._callbacks;
    this._componentClass = Polymer({
      is: hookName,
      properties: {
        plugin: Object,
        content: Object,
      },
      attached() {
        callbacks.forEach(callback => {
          callback(this);
        });
      },
    });
  }

  GrDomHook.prototype.onAttached = function(callback) {
    this._callbacks.push(callback);
    return this;
  };

  GrDomHook.prototype.getModuleName = function() {
    return this._componentClass.prototype.is;
  };

  window.GrDomHooks = GrDomHooks;
})(window);
